// Copyright (C) 2018-2023 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//

#include <gtest/gtest.h>

#include <ngraph_functions/builders.hpp>
#include "openvino/op/prelu.hpp"
#include "base_reference_test.hpp"

using namespace reference_tests;
using namespace ov;

namespace {
struct PreluParams {
    template <class IT>
    PreluParams(const ov::PartialShape& shape, const ov::element::Type& iType, const std::vector<IT>& iValues, const std::vector<IT>& oValues,
                const ov::Shape& slopeShape, const std::vector<IT>& negativeSlopeValues, const std::string& test_name = "")
        : pshape(shape),
          inType(iType),
          outType(iType),
          inputData(CreateTensor(iType, iValues)),
          refData(CreateTensor(iType, oValues)),
          negativeSlopeShape(slopeShape),
          negativeSlope(CreateTensor(iType, negativeSlopeValues)),
          testcaseName(test_name) {}

    ov::PartialShape pshape;
    ov::element::Type inType;
    ov::element::Type outType;
    ov::Tensor inputData;
    ov::Tensor refData;
    ov::Shape negativeSlopeShape;
    ov::Tensor negativeSlope;
    std::string testcaseName;
};

class ReferencePreluLayerTest : public testing::TestWithParam<PreluParams>, public CommonReferenceTest {
public:
    void SetUp() override {
        auto params = GetParam();
        function = CreateFunction(params.pshape, params.negativeSlopeShape, params.inType);
        inputData = {params.inputData, params.negativeSlope};
        refOutData = {params.refData};
    }
    static std::string getTestCaseName(const testing::TestParamInfo<PreluParams>& obj) {
        auto param = obj.param;
        std::ostringstream result;
        result << "shape=" << param.pshape << "_";
        result << "iType=" << param.inType << "_";
        result << "oType=" << param.outType << "_";
        if (param.testcaseName != "") {
            result << "slopeShape=" << param.negativeSlopeShape << "_";
            result << param.testcaseName;
        } else {
            result << "slopeShape=" << param.negativeSlopeShape;
        }

        return result.str();
    }

private:
    static std::shared_ptr<Model> CreateFunction(const PartialShape& input_shape, const Shape& slope_shape, const element::Type& input_type) {
        const auto in = std::make_shared<op::v0::Parameter>(input_type, input_shape);
        const auto SLOPE = std::make_shared<op::v0::Parameter>(input_type, slope_shape);
        const auto Prelu = std::make_shared<op::v0::PRelu>(in, SLOPE);
        return std::make_shared<ov::Model>(NodeVector {Prelu}, ParameterVector {in, SLOPE});
    }
};

TEST_P(ReferencePreluLayerTest, CompareWithRefs) {
    Exec();
}

template <element::Type_t IN_ET>
std::vector<PreluParams> generatePreluFloatParams() {
    using T = typename element_type_traits<IN_ET>::value_type;

    std::vector<PreluParams> preluParams {
        PreluParams(ov::PartialShape {6},
                    IN_ET,
                    std::vector<T>{1, 2, -3, -4, 5, 6},
                    std::vector<T>{1, 2, -6, -8, 5, 6},
                    ov::Shape {1},
                    std::vector<T>{2}),
        PreluParams(ov::PartialShape {6},
                    IN_ET,
                    std::vector<T>{1, 2, -3, -4, 5, 6},
                    std::vector<T>{1, 2, -12, -20, 5, 6},
                    ov::Shape {6},
                    std::vector<T>{2, 3, 4, 5, 6, 7}),
        PreluParams(ov::PartialShape {3, 2},
                    IN_ET,
                    std::vector<T>{-2, 3, -2, 1, -1, 0},
                    std::vector<T>{0, 3, 0, 1, 0, 0},
                    ov::Shape {2},
                    std::vector<T>{0, 1}),
        PreluParams(ov::PartialShape {2, 6},
                    IN_ET,
                    std::vector<T>{1, 2, -3, -4, 5, 6, 7, 8, -9, -10, 11, 12},
                    std::vector<T>{1, 2, -9, -16, 5, 6, 7, 8, -27, -40, 11, 12},
                    ov::Shape {6},
                    std::vector<T>{1, 2, 3, 4, 5, 6}),
        PreluParams(ov::PartialShape {3, 2},
                    IN_ET,
                    std::vector<T>{-1, -1, -1, -1, -1, -1},
                    std::vector<T>{-2, -0.5, -2, -0.5, -2, -0.5},
                    ov::Shape {2},
                    std::vector<T>{2, 0.5},
                    "C_2_const"),
        PreluParams(ov::PartialShape {2, 2, 2},
                    IN_ET,
                    std::vector<T>{-0.5, -2, -3, -4, -5, -6, -7, -8},
                    std::vector<T>{0.25, 1, 6, 8, 2.5, 3, 14, 16},
                    ov::Shape {2},
                    std::vector<T>{-0.5, -2}),
        PreluParams(ov::PartialShape {3, 2},
                    IN_ET,
                    std::vector<T>{-2, 3, -2, 1, -1, 0},
                    std::vector<T>{1, 3, 1, 1, 0.5, 0},
                    ov::Shape {2},
                    std::vector<T>{-0.5, -1},
                    "negative_slope"),
        PreluParams(ov::PartialShape {2, 6},
                    IN_ET,
                    std::vector<T>{1, 2, -3, -4, 5, 6, 1, 2, -3, -4, 5, 6},
                    std::vector<T>{1, 2, -6, -8, 5, 6, 1, 2, -12, -8, 5, 6},
                    ov::Shape {2, 6},
                    std::vector<T>{2, 2, 2, 2, 2, 2, 1, 1, 4, 2, 1, 1}),
        PreluParams(ov::PartialShape {2, 2, 2, 2},
                    IN_ET,
                    std::vector<T>{1, 2, -3, -4, 1, 2, -3, -4, 1, 2, -3, -4, 1, 2, -3, -4},
                    std::vector<T>{1, 2, -3, -8, 1, 2, -9, -16, 1, 2, -3, -8, 1, 2, -9, -16},
                    ov::Shape {2, 1, 2},
                    std::vector<T>{1, 2, 3, 4}),
        PreluParams(ov::PartialShape {2, 2, 2, 2},
                    IN_ET,
                    std::vector<T>{1, 2, -3, -4, 1, 2, -3, -4, 1, 2, -3, -4, 1, 2, -3, -4},
                    std::vector<T>{1, 2, -3, -8, 1, 2, -9, -16, 1, 2, -3, -8, 1, 2, -9, -16},
                    ov::Shape {1, 2, 1, 2},
                    std::vector<T>{1, 2, 3, 4}),
        PreluParams(ov::PartialShape {2, 2, 6},
                    IN_ET,
                    std::vector<T>{1, 2, -3, -4, -5, 6, -1, -2, -3, -4, -5, -6, 1, 2, -3, -4, 5, 6, -2, 4, -6, -8, 10, 12},
                    std::vector<T>{1, 2, -9, -16, -5, 6, -2, -2, -9, -16, -5, -42, 1, 2, -9, -16, 5, 6, -2, 4, -18, -32, 10, 12},
                    ov::Shape {2, 1, 6},
                    std::vector<T>{2, 1, 3, 4, 1, 7, 1, 2, 3, 4, 5, 6}),
        PreluParams(ov::PartialShape {2, 3, 2},
                    IN_ET,
                    std::vector<T>{1, 2, -3, -4, -5, 6, -1, -2, -3, -4, -5, -6},
                    std::vector<T>{1, 2, -9, -16, -5, 6, -1, -4, -9, -16, -25, -36},
                    ov::Shape {2, 3, 2},
                    std::vector<T>{2, 1, 3, 4, 1, 7, 1, 2, 3, 4, 5, 6}),
        PreluParams(ov::PartialShape {2, 1, 2},
                    IN_ET,
                    std::vector<T>{-10, -10, -10, -10},
                    std::vector<T>{-1, -100, -1, -100},
                    ov::Shape {2},
                    std::vector<T>{0.1, 10}),
        PreluParams(ov::PartialShape {1, 2, 1, 2},
                    IN_ET,
                    std::vector<T>{-10, -10, -10, -10},
                    std::vector<T>{-1, -1, -100, -100},
                    ov::Shape {2},
                    std::vector<T>{0.1, 10}),
        PreluParams(ov::PartialShape {1, 5, 1, 1},
                    IN_ET,
                    std::vector<T>{-1, 0, -1, -1, -1},
                    std::vector<T>{-1, 0, -3, -4, -5},
                    ov::Shape {5},
                    std::vector<T>{1, 2, 3, 4, 5}),
        PreluParams(ov::PartialShape {2, 3, 4, 5},
                    IN_ET,
                    std::vector<T>{-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.},
                    std::vector<T>{-0.,   -1.,   -2.,   -3.,   -4.,   -5.,   -6.,   -7.,   -8.,   -9.,   -10.,  -11.,  -12.,  -13.,  -14.,
                                   -15.,  -16.,  -17.,  -18.,  -19.,  -20.,  -21.,  -22.,  -23.,  -24.,  -25.,  -26.,  -27.,  -28.,  -29.,
                                   -30.,  -31.,  -32.,  -33.,  -34.,  -35.,  -36.,  -37.,  -38.,  -39.,  -40.,  -41.,  -42.,  -43.,  -44.,
                                   -45.,  -46.,  -47.,  -48.,  -49.,  -50.,  -51.,  -52.,  -53.,  -54.,  -55.,  -56.,  -57.,  -58.,  -59.,
                                   -60.,  -61.,  -62.,  -63.,  -64.,  -65.,  -66.,  -67.,  -68.,  -69.,  -70.,  -71.,  -72.,  -73.,  -74.,
                                   -75.,  -76.,  -77.,  -78.,  -79.,  -80.,  -81.,  -82.,  -83.,  -84.,  -85.,  -86.,  -87.,  -88.,  -89.,
                                   -90.,  -91.,  -92.,  -93.,  -94.,  -95.,  -96.,  -97.,  -98.,  -99.,  -100., -101., -102., -103., -104.,
                                   -105., -106., -107., -108., -109., -110., -111., -112., -113., -114., -115., -116., -117., -118., -119.},
                    ov::Shape {2, 3, 4, 5},
                    std::vector<T>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
                                   18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
                                   36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
                                   54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
                                   72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
                                   90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
                                   108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119}),
        PreluParams(ov::PartialShape {2, 3, 4, 5},
                    IN_ET,
                    std::vector<T>{-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.},
                    std::vector<T>{-0., -1., -2., -3., -4., -0., -1., -2., -3., -4., -0., -1., -2., -3., -4., -0., -1., -2.,
                                   -3., -4., -0., -1., -2., -3., -4., -0., -1., -2., -3., -4., -0., -1., -2., -3., -4., -0.,
                                   -1., -2., -3., -4., -0., -1., -2., -3., -4., -0., -1., -2., -3., -4., -0., -1., -2., -3.,
                                   -4., -0., -1., -2., -3., -4., -0., -1., -2., -3., -4., -0., -1., -2., -3., -4., -0., -1.,
                                   -2., -3., -4., -0., -1., -2., -3., -4., -0., -1., -2., -3., -4., -0., -1., -2., -3., -4.,
                                   -0., -1., -2., -3., -4., -0., -1., -2., -3., -4., -0., -1., -2., -3., -4., -0., -1., -2.,
                                   -3., -4., -0., -1., -2., -3., -4., -0., -1., -2., -3., -4.},
                    ov::Shape {5},
                    std::vector<T>{0, 1, 2, 3, 4}),
        PreluParams(ov::PartialShape {2, 3, 4, 5},
                    IN_ET,
                    std::vector<T>{-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.},
                    std::vector<T>{-0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0.,
                                   -0., -0., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2.,
                                   -2., -2., -2., -2., -2., -2., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0.,
                                   -0., -0., -0., -0., -0., -0., -0., -0., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -2., -2., -2., -2., -2., -2., -2., -2.,
                                   -2., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2.},
                    ov::Shape {3},
                    std::vector<T>{0, 1, 2}),
        PreluParams(ov::PartialShape {2, 3, 4, 5},
                    IN_ET,
                    std::vector<T>{-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.},
                    std::vector<T>{-0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0.,
                                   -0., -0., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2.,
                                   -2., -2., -2., -2., -2., -2., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0.,
                                   -0., -0., -0., -0., -0., -0., -0., -0., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
                                   -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -2., -2., -2., -2., -2., -2., -2., -2.,
                                   -2., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2.},
                    ov::Shape {3, 1, 1},
                    std::vector<T>{0, 1, 2})
    };
    return preluParams;
}

template <element::Type_t IN_ET>
std::vector<PreluParams> generatePreluI8Params() {
    using T = typename element_type_traits<IN_ET>::value_type;

    std::vector<PreluParams> preluParams {
        PreluParams(ov::PartialShape {6},
                    IN_ET,
                    std::vector<T>{1, 2, -3, -4, 5, 6},
                    std::vector<T>{1, 2, -6, -8, 5, 6},
                    ov::Shape {1},
                    std::vector<T>{2}),
        PreluParams(ov::PartialShape {6},
                    IN_ET,
                    std::vector<T>{1, 2, -3, -4, 5, 6},
                    std::vector<T>{1, 2, -12, -20, 5, 6},
                    ov::Shape {6},
                    std::vector<T>{2, 3, 4, 5, 6, 7}),
        PreluParams(ov::PartialShape {3, 2},
                    IN_ET,
                    std::vector<T>{-2, 3, -2, 1, -1, 0},
                    std::vector<T>{0, 3, 0, 1, 0, 0},
                    ov::Shape {2},
                    std::vector<T>{0, 1}),
        PreluParams(ov::PartialShape {2, 6},
                    IN_ET,
                    std::vector<T>{1, 2, -3, -4, 5, 6, 7, 8, -9, -10, 11, 12},
                    std::vector<T>{1, 2, -9, -16, 5, 6, 7, 8, -27, -40, 11, 12},
                    ov::Shape {6},
                    std::vector<T>{1, 2, 3, 4, 5, 6}),
        PreluParams(ov::PartialShape {2, 6},
                    IN_ET,
                    std::vector<T>{1, 2, -3, -4, 5, 6, 1, 2, -3, -4, 5, 6},
                    std::vector<T>{1, 2, -6, -8, 5, 6, 1, 2, -12, -8, 5, 6},
                    ov::Shape {2, 6},
                    std::vector<T>{2, 2, 2, 2, 2, 2, 1, 1, 4, 2, 1, 1}),
        PreluParams(ov::PartialShape {2, 2, 2, 2},
                    IN_ET,
                    std::vector<T>{1, 2, -3, -4, 1, 2, -3, -4, 1, 2, -3, -4, 1, 2, -3, -4},
                    std::vector<T>{1, 2, -3, -8, 1, 2, -9, -16, 1, 2, -3, -8, 1, 2, -9, -16},
                    ov::Shape {2, 1, 2},
                    std::vector<T>{1, 2, 3, 4}),
        PreluParams(ov::PartialShape {2, 2, 2, 2},
                    IN_ET,
                    std::vector<T>{1, 2, -3, -4, 1, 2, -3, -4, 1, 2, -3, -4, 1, 2, -3, -4},
                    std::vector<T>{1, 2, -3, -8, 1, 2, -9, -16, 1, 2, -3, -8, 1, 2, -9, -16},
                    ov::Shape {1, 2, 1, 2},
                    std::vector<T>{1, 2, 3, 4}),
        PreluParams(ov::PartialShape {2, 2, 6},
                    IN_ET,
                    std::vector<T>{1, 2, -3, -4, -5, 6, -1, -2, -3, -4, -5, -6, 1, 2, -3, -4, 5, 6, -2, 4, -6, -8, 10, 12},
                    std::vector<T>{1, 2, -9, -16, -5, 6, -2, -2, -9, -16, -5, -42, 1, 2, -9, -16, 5, 6, -2, 4, -18, -32, 10, 12},
                    ov::Shape {2, 1, 6},
                    std::vector<T>{2, 1, 3, 4, 1, 7, 1, 2, 3, 4, 5, 6}),
        PreluParams(ov::PartialShape {2, 3, 2},
                    IN_ET,
                    std::vector<T>{1, 2, -3, -4, -5, 6, -1, -2, -3, -4, -5, -6},
                    std::vector<T>{1, 2, -9, -16, -5, 6, -1, -4, -9, -16, -25, -36},
                    ov::Shape {2, 3, 2},
                    std::vector<T>{2, 1, 3, 4, 1, 7, 1, 2, 3, 4, 5, 6}),
        PreluParams(ov::PartialShape {1, 5, 1, 1},
                    IN_ET,
                    std::vector<T>{-1, 0, -1, -1, -1},
                    std::vector<T>{-1, 0, -3, -4, -5},
                    ov::Shape {5},
                    std::vector<T>{1, 2, 3, 4, 5}),
        PreluParams(ov::PartialShape {2, 3, 4, 5},
                    IN_ET,
                    std::vector<T>{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
                    std::vector<T>{-0,   -1,   -2,   -3,   -4,   -5,   -6,   -7,   -8,   -9,   -10,  -11,  -12,  -13,  -14,
                                   -15,  -16,  -17,  -18,  -19,  -20,  -21,  -22,  -23,  -24,  -25,  -26,  -27,  -28,  -29,
                                   -30,  -31,  -32,  -33,  -34,  -35,  -36,  -37,  -38,  -39,  -40,  -41,  -42,  -43,  -44,
                                   -45,  -46,  -47,  -48,  -49,  -50,  -51,  -52,  -53,  -54,  -55,  -56,  -57,  -58,  -59,
                                   -60,  -61,  -62,  -63,  -64,  -65,  -66,  -67,  -68,  -69,  -70,  -71,  -72,  -73,  -74,
                                   -75,  -76,  -77,  -78,  -79,  -80,  -81,  -82,  -83,  -84,  -85,  -86,  -87,  -88,  -89,
                                   -90,  -91,  -92,  -93,  -94,  -95,  -96,  -97,  -98,  -99,  -100, -101, -102, -103, -104,
                                   -105, -106, -107, -108, -109, -110, -111, -112, -113, -114, -115, -116, -117, -118, -119},
                    ov::Shape {2, 3, 4, 5},
                    std::vector<T>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
                                   18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
                                   36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
                                   54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
                                   72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
                                   90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
                                   108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119}),
        PreluParams(ov::PartialShape {2, 3, 4, 5},
                    IN_ET,
                    std::vector<T>{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
                    std::vector<T>{-0, -1, -2, -3, -4, -0, -1, -2, -3, -4, -0, -1, -2, -3, -4, -0, -1, -2,
                                   -3, -4, -0, -1, -2, -3, -4, -0, -1, -2, -3, -4, -0, -1, -2, -3, -4, -0,
                                   -1, -2, -3, -4, -0, -1, -2, -3, -4, -0, -1, -2, -3, -4, -0, -1, -2, -3,
                                   -4, -0, -1, -2, -3, -4, -0, -1, -2, -3, -4, -0, -1, -2, -3, -4, -0, -1,
                                   -2, -3, -4, -0, -1, -2, -3, -4, -0, -1, -2, -3, -4, -0, -1, -2, -3, -4,
                                   -0, -1, -2, -3, -4, -0, -1, -2, -3, -4, -0, -1, -2, -3, -4, -0, -1, -2,
                                   -3, -4, -0, -1, -2, -3, -4, -0, -1, -2, -3, -4},
                    ov::Shape {5},
                    std::vector<T>{0, 1, 2, 3, 4}),
        PreluParams(ov::PartialShape {2, 3, 4, 5},
                    IN_ET,
                    std::vector<T>{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
                    std::vector<T>{-0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0,
                                   -0, -0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
                                   -2, -2, -2, -2, -2, -2, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0,
                                   -0, -0, -0, -0, -0, -0, -0, -0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2,
                                   -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2},
                    ov::Shape {3},
                    std::vector<T>{0, 1, 2}),
        PreluParams(ov::PartialShape {2, 3, 4, 5},
                    IN_ET,
                    std::vector<T>{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
                    std::vector<T>{-0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0,
                                   -0, -0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
                                   -2, -2, -2, -2, -2, -2, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0,
                                   -0, -0, -0, -0, -0, -0, -0, -0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                                   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2,
                                   -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2},
                    ov::Shape {3, 1, 1},
                    std::vector<T>{0, 1, 2})
    };
    return preluParams;
}

std::vector<PreluParams> generatePreluCombinedParams() {
    const std::vector<std::vector<PreluParams>> preluTypeParams {
        generatePreluFloatParams<element::Type_t::f32>(),
        generatePreluFloatParams<element::Type_t::f16>(),
        generatePreluFloatParams<element::Type_t::bf16>(),
        generatePreluI8Params<element::Type_t::i8>()
        };
    std::vector<PreluParams> combinedParams;

    for (const auto& params : preluTypeParams) {
        combinedParams.insert(combinedParams.end(), params.begin(), params.end());
    }
    return combinedParams;
}

INSTANTIATE_TEST_SUITE_P(smoke_Prelu_With_Hardcoded_Refs, ReferencePreluLayerTest,
    testing::ValuesIn(generatePreluCombinedParams()), ReferencePreluLayerTest::getTestCaseName);

} // namespace
